#define _USE_MATH_DEFINES
#include "photovoltaic.h"
#include <QString>
#include <cmath>

// 构造函数实现
Photovoltaic::Photovoltaic(const QString& name, double capacity)
    : Component(name, 0.9),  // 光伏效率通常较高
    maxCapacity(capacity),
    temperature(25.0),     // 默认温度25°C
    irradiation(1000.0)    // 默认光照强度1000W/m²
{
    if (maxCapacity < 0) maxCapacity = 0;

    // 初始化预测曲线（默认全天均匀发电）
    powerForecast.resize(96); // 96个时间点（24小时，每15分钟一个）
    for (int i = 0; i < 96; ++i) {
        // 模拟白天发电，夜晚不发电
        if (i >= 24 && i < 72) { // 假设6:00-18:00有光照
            powerForecast[i] = maxCapacity * (0.3 + 0.7 * std::sin((i-24) * M_PI / 48));
        } else {
            powerForecast[i] = 0;
        }
    }

    setActive(true); // 光伏通常默认激活（只要有光照）
}

// 析构函数实现
Photovoltaic::~Photovoltaic()
{
    // 清理资源（如果有）
}

// 设置功率预测曲线
void Photovoltaic::setPowerForecast(const QVector<double>& forecast)
{
    if (!forecast.isEmpty()) {
        powerForecast = forecast;
    }
}

// 获取功率预测曲线
QVector<double> Photovoltaic::getPowerForecast() const
{
    return powerForecast;
}

// 获取指定时间的预测功率
double Photovoltaic::getForecastPower(int timeIndex) const
{
    if (timeIndex >= 0 && timeIndex < powerForecast.size()) {
        return powerForecast[timeIndex];
    }
    return 0;
}

// 设置最大容量
void Photovoltaic::setMaxCapacity(double capacity)
{
    if (capacity >= 0) {
        maxCapacity = capacity;
    }
}

// 获取最大容量
double Photovoltaic::getMaxCapacity() const
{
    return maxCapacity;
}

// 设置温度
void Photovoltaic::setTemperature(double temp)
{
    temperature = temp;
}

// 获取温度
double Photovoltaic::getTemperature() const
{
    return temperature;
}

// 设置光照强度
void Photovoltaic::setIrradiation(double irrad)
{
    if (irrad >= 0) {
        irradiation = irrad;
    }
}

// 获取光照强度
double Photovoltaic::getIrradiation() const
{
    return irradiation;
}

// 计算当前理论最大功率（基于温度和光照）
double Photovoltaic::calculateTheoreticalMax() const
{
    // 简化模型：功率与光照强度成正比，与温度成反比
    double tempFactor = 1.0 - 0.005 * (temperature - 25.0); // 温度系数-0.5%/°C
    return maxCapacity * (irradiation / 1000.0) * tempFactor;
}

// 更新当前功率（基于预测曲线和时间）
void Photovoltaic::updatePower(int timeIndex)
{
    double forecastPower = getForecastPower(timeIndex);
    double theoreticalMax = calculateTheoreticalMax();

    // 取预测功率和理论最大功率中的较小值
    double newPower = std::min(forecastPower, theoreticalMax);
    setPower(newPower);
}

// 重写基类的获取状态方法
QString Photovoltaic::getStatus() const
{
    return QString("%1\n最大容量: %2 kW\n温度: %3 °C\n光照强度: %4 W/m²\n理论最大功率: %5 kW")
        .arg(Component::getStatus())
        .arg(maxCapacity)
        .arg(temperature)
        .arg(irradiation)
        .arg(calculateTheoreticalMax());
}
// 设置优化算法

